package com.zpark;

import java.util.Arrays;
import java.util.Scanner;

public class demo03 {
    public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入您要之后的几个序列");
        int n = scan.nextInt();
        for (int i = 0; i < n; i++) {
            System.out.println(Arrays.toString(nextPermutation(arr)));
        }
    }

    private static int[] nextPermutation(int[] arr) {
        int size = arr.length; // 后面多次用到，为方便书写，提出来一个变量保存
        int flag = size - 1; // 同样是为了方便书写，你也可以不这么做
        int tmp = 0; // 叫tmp变量的，通常只是为了交换两个变量而定义的临时变量
// 从右向左找，找到满足左边比当前位置的数值小的那个下标
        while (flag != 0 && arr[flag - 1] > arr[flag])
            flag--;
// 如果flag为0，说明这个序列是降序的，我们只用做个倒序就好
        if (flag == 0) {
            for (int i = 0; i < size / 2; i++) {
                tmp = arr[i];
                arr[i] = arr[size - 1 - i];
                arr[size - 1 - i] = tmp;
            }
            return arr; // 这个别忘了
        }
// 这里可以取巧，阅读上方代码，会发现，flag右边位置的所有数，满足从右到左按照从小到大排列
// 所以我们逆序遍历，只要找到比flag-1位置大的数，就把他与flag-1位置的数对换
        for (int i = size - 1; i >= flag; i--) {
            if (arr[i] > arr[flag - 1]) {
                tmp = arr[flag - 1];
                arr[flag - 1] = arr[i];
                arr[i] = tmp;
                break;
            }
        }
// 接着将序列从flag位置到末尾，首尾互换即可
        while (flag < size - 1) {
            tmp = arr[size - 1];
            arr[size - 1] = arr[flag];
            arr[flag] = tmp;
            flag++;
            size--;
        }
        return arr;
    }
}
